package com.yang.mall.Controller;

import com.yang.mall.consts.MallConst;
import com.yang.mall.form.UserLoginForm;
import com.yang.mall.form.UserRegisterForm;
import com.yang.mall.pojo.User;
import com.yang.mall.service.IUserService;
import com.yang.mall.vo.ResponseVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.Objects;
import static com.yang.mall.enums.ResponseEnum.PARAM_ERROM;

@RestController
//@RequestMapping("")
@Slf4j
public class UserController {
    @Autowired
    private IUserService userService;

    // 前端发送urlencode发送格式时使用RequestParam注解  json格式时使用RequestBody
    @PostMapping("/user/register")
    // 返回与接收json格式数据      // BindingResult是一个用来校验前端传进来的参数的API  必须要使用@Valid才能生效
    public ResponseVo<User> register(@Valid @RequestBody UserRegisterForm userRegisterForm) {

        User user = new User();
        // 改工具类用来将源对象信息传递给目标对象
        BeanUtils.copyProperties(userRegisterForm, user);
        return userService.register(user);
    }

    @PostMapping("/user/login")
    public ResponseVo<User> login(@Valid @RequestBody UserLoginForm userLoginForm,
                                    HttpSession session) {
        ResponseVo<User> userResponseVo = userService.login(userLoginForm.getUsername(), userLoginForm.getPassword());
        session.setAttribute(MallConst.CURRENT_USER, userResponseVo.getData());
        return userResponseVo;
    }

    /*
    * session保存在内存当中,一旦服务器重启就会消失，所以我们可以将session保存在数据库当中(redis)
    *  注意一个 cookie跨域的问题  localhost和127.0.0.1也属于是跨域 session和cookie是设置在当前域名或者ip下的
    * session和cookie不分家，sessionID也是存放在cookie中的  所以cookie不安全 session也不安全，被劫持的session一样很危险可以直接登录
    * */
    // TODO: 2022/7/18  改进版方法token+session
    @GetMapping("/user")
    public ResponseVo<User> userInfo(HttpSession session) {
        User user =(User) session.getAttribute(MallConst.CURRENT_USER);
        return ResponseVo.success(user);
    }

    // 退出登录
    @PostMapping("/user/logout")
    public ResponseVo logout(HttpSession session) {
        log.info("/user/logout 移除session");
        session.removeAttribute(MallConst.CURRENT_USER);
        return ResponseVo.success();
    }
}

